package ar.uba.fi.taller2.cmmiassistant.frontend.util;

import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;

import javax.swing.JCheckBox;
import javax.swing.JLabel;
import javax.swing.JPanel;

import ar.uba.fi.taller2.cmmiassistant.frontend.evaluacion.util.ConversorEvaluables;
import ar.uba.fi.taller2.cmmiassistant.modelo.resultados.NivelCumplimientoObjetivo;
import ar.uba.fi.taller2.cmmiassistant.modelo.resultados.NivelCumplimientoPractica;

import com.jgoodies.forms.factories.FormFactory;
import com.jgoodies.forms.layout.CellConstraints;
import com.jgoodies.forms.layout.ColumnSpec;
import com.jgoodies.forms.layout.FormLayout;
import com.jgoodies.forms.layout.RowSpec;

public class ItemToEvaluateEditor extends JPanel{


	/**
	 * 
	 */
	private static final long serialVersionUID = -6158926772993272280L;
	
	private JLabel lblItemToEvaluate;
	private JCheckBox chkIsSatisfied;
	
	private ConversorEvaluables conversorEvaluable = null;
	private Object ent = null;
	private Object nivelCumplimiento = null;
	
	private void initialize(){
		setLayout(new FormLayout(
				new ColumnSpec[] {
					FormFactory.RELATED_GAP_COLSPEC,
					new ColumnSpec("right:default:grow(1.0)"),
					FormFactory.RELATED_GAP_COLSPEC,
					FormFactory.DEFAULT_COLSPEC,
					FormFactory.RELATED_GAP_COLSPEC},
				new RowSpec[] {
					FormFactory.RELATED_GAP_ROWSPEC,
					FormFactory.DEFAULT_ROWSPEC,
					FormFactory.RELATED_GAP_ROWSPEC}));

			chkIsSatisfied = new JCheckBox();
			chkIsSatisfied.addActionListener(listenerEvaluarItem);
			add(chkIsSatisfied, new CellConstraints(4, 2));

			lblItemToEvaluate = new JLabel();
			add(lblItemToEvaluate, new CellConstraints(2, 2));
					
	}
	
	public ItemToEvaluateEditor(Object ent, ConversorEvaluables conversor){
		super();
		initialize();		
//		this.setMaximumSize(new Dimension(Short.MAX_VALUE,30));
//		this.setPreferredSize(new Dimension(Double.MAX_VALUE,30));
		this.conversorEvaluable = conversor;
		this.ent = ent;
		
		String item = conversor.getNombreCalificacion(ent);
		boolean isSelected = false;
		nivelCumplimiento = conversor.getCalificacion(ent);
		isSelected = getSeleccionSegunNivelCumplimiento();
		
		lblItemToEvaluate.setText(item);
		chkIsSatisfied.setSelected(isSelected);
	}

	private ActionListener listenerEvaluarItem = new ActionListener(){
		public void actionPerformed(ActionEvent arg0) {
			Object nivelCumplimiento = getNivelCumplientoDeCheck();
			getConversorEvaluable().notificarCambioCalificacion(ent, nivelCumplimiento);			
		};
	};

	public ConversorEvaluables getConversorEvaluable() {
		return conversorEvaluable;
	}


	public void setConversorEvaluable(ConversorEvaluables conversorEvaluable) {
		this.conversorEvaluable = conversorEvaluable;
	}

	private boolean getSeleccionSegunNivelCumplimiento() {
		boolean isSelected =false;
		if (nivelCumplimiento instanceof NivelCumplimientoObjetivo){
			NivelCumplimientoObjetivo cumplimientoObjetivo = (NivelCumplimientoObjetivo)nivelCumplimiento;
			isSelected = cumplimientoObjetivo.equals(NivelCumplimientoObjetivo.NO_SATISFECHO)?false:true;
		}
		
		if (nivelCumplimiento instanceof NivelCumplimientoPractica){
			NivelCumplimientoPractica cumplimientoPractica = (NivelCumplimientoPractica)nivelCumplimiento;
			isSelected = cumplimientoPractica.equals(NivelCumplimientoPractica.ALTO)?true:false;
		}
		return isSelected;
	}

	protected Object getNivelCumplientoDeCheck() {
		if (nivelCumplimiento instanceof NivelCumplimientoObjetivo){
			nivelCumplimiento = chkIsSatisfied.isSelected()?NivelCumplimientoObjetivo.SATISFECHO:NivelCumplimientoObjetivo.NO_SATISFECHO;			
		}
		
		if (nivelCumplimiento instanceof NivelCumplimientoPractica){
			nivelCumplimiento = chkIsSatisfied.isSelected()?NivelCumplimientoPractica.ALTO:NivelCumplimientoPractica.BAJO;
		}
		return nivelCumplimiento;
	}
	
	public Dimension getMaximumSize() {
	    Dimension size = getPreferredSize();
	    size.width = Short.MAX_VALUE;
	    return size;
	}
}
